﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<algorithm>
using namespace std;
//bool lemonadeChange(vector<int>& bills) {
//	int five = 0, ten = 0;
//	for (auto& e : bills)
//	{
//		if (e == 5)
//			five++;
//		else if (e == 10)
//		{
//			if (five == 0)
//				return false;
//			five--;
//		}
//		else
//		{
//			if (five >= 3)
//				five -= 3;
//			else if (five >= 1 && ten >= 1)
//			{
//				five--;
//				ten--;
//			}
//			else
//				return false;
//		}
//	}
//	return true;
//}
//int main()
//{
//
//	return 0;
//}
// 
//
//
//template<class T>
//struct myless
//{
//	bool operator()( const T& left,  const T& right)
//	{
//		return left < right;
//	}
//};
//
//template<class T>
//struct myless<T*>
//{
//	//小坑，注意要构成偏特化时const要放在T*后面，因为在原模板中
//	// const要修饰left和right使其不能改变
//	bool operator()(T* const& left, T* const& right)
//	{
//		return *left < *right;
//	}
//};
//class Date
//{
//public:
//	Date(int y,int m,int d)
//		:_year(y)
//		,_month(m)
//		,_day(d)
//	{}
//	bool operator<(const Date& d) const
//	{
//		if (_year < d._year)
//			return true;
//		else if (_year > d._year)
//			return false;
//		else
//		{
//			if (_month < d._month)
//				return true;
//			else if (_month > d._month)
//				return false;
//			else
//			{
//				if (_day < d._day)
//					return true;
//				else 
//					return false;
//			}
//		}
//	}
//	Date& operator*()
//	{
//		return *this;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//int main()
//{
//	Date d1(2022, 7, 7);
//	Date d2(2022, 7, 6);
//	Date d3(2022, 7, 8);
//	vector<Date> v1;
//	v1.push_back(d1);
//	v1.push_back(d2);
//	v1.push_back(d3);
//	// 可以直接排序，结果是日期升序
//	sort(v1.begin(), v1.end(), myless<Date>());
//	vector<Date*> v2;
//	v2.push_back(&d1);
//	v2.push_back(&d2);
//	v2.push_back(&d3);
//
//	// 此处需要在排序过程中，让sort比较v2中存放地址指向的日期对象
//	// 此处走的是偏特化，
//	sort(v2.begin(), v2.end(), myless<Date*>());
//	return 0;
//}
int halveArray(vector<int>& nums) {
	priority_queue<double> heap;
	double sum = 0;
	for (auto& e : nums)
	{
		heap.push(e);
		sum += e;
	}
	sum /= 2.0;
	int count = 0;
	while (sum > 0)
	{
		double tmp = heap.top();
		heap.pop();
		tmp /= 2.0;
		sum -= tmp;
		heap.push(tmp);
		count++;
	}
	return count;
}
struct Compare
{
	bool operator()(string& s1, string& s2)
	{
		if (s1 + s2 > s2 + s1)
			return true;
		else
			return false;
	}
};
string largestNumber(vector<int>& nums) {
	int n = nums.size();
	vector<string> v(n);
	for (auto& e : nums)
		v.push_back(to_string(e));
	sort(v.begin(), v.end(), Compare());
	string ret;
	for (auto& e : v)
		ret += e;
	return ret;
}
int main()
{
	vector<int> nums = { 1,2,3,4,5,6,7,8,9,0 };
	largestNumber(nums);
	return 0;
}